iT邦幫忙

0
鐵人賽 神助攻 HERE Technologies

快速建構地圖服務(八)- 認識 Matrix Routing

WW 2020-09-16 17:23:302001 瀏覽
  • 分享至 

  • xImage
  •  

快速建構地圖服務(八)- 認識 HERE Routing API - Matrix Routing

Matrix Routing 是用來做什麼的?如果說 Routing API 的主要功能是用來計算一條路徑,不管是從 A 到 B,還是中間經過若干個途經點,我們都是算出一條從起點到終點的路徑;但 Matrix Routing 要提供的功能不僅於此,它的目的在於算出「一對多」、「多對一」、「多對多」的路徑計算。

  • 一對多:從一個起點到多個可能的終點。
  • 多對一:從多個可能的起點到一個終點。
  • 多對多:從多個可能的起點到多個可能的終點。

其實在現實生活中,我們經常會遇到抉擇性的問題:今天騎著機車在路上,才驚覺油箱快要見底,那麼我只能拿出手機搜尋附近有沒有加油站,但如果地圖攤開之後附近有好幾個加油站,我要怎麼選擇去哪一個加油站?這算是一個「一對多」的使用場景,要算出一個起點(我現在的位置)到多個可能的終點(附近的所有加油站)的路徑,並且選擇一個最有利的結果。

假設今天是一個計程車公司,我接到客戶用 APP 叫車的需求,要怎麼在附近所有的計程車中挑選出一台最快抵達客戶所在位置的?這算是一個「多對一」的使用場景,要算出多個可能的起點(可以載客的計程車)到一個終點(客戶所在位置)的路徑,並且選擇一個最有利的結果。

至於「多對多」則有可能是在物流的車隊,同時收到許多客戶的取貨要求,那就必須要把車隊的車輛與這些客戶的位置進行計算,並且算出最有利的結果來達成需求。

HERE Routing API 的 Matrix Routing 的功能就在於輸出這些起點與終點之間的「相對空間關係」,您可以使用 Matrix Routing 基於距離或時間來算出點到點之間的「成本係數」,成本愈高,就代表移動距離愈長或時間愈長;反之若成本愈低,則代表移動距離愈短或時間愈短。您可以用這樣的方式來判斷哪一個結果是您最想要的。

HERE Routing API 的 Matrix Routing 功能跟基本的路徑規劃功能類似,也具有以下特色:

  • 支援汽車、卡車、機車、自行車、大眾運輸與行人的路徑規劃。
  • 可以設定避開特定道路或區域。
  • 可以支援即時/歷史道路路況,預估出更準確的到達時間並避開壅塞路段。
  • 可以選擇時間優先或距離優先。
  • 支援多語系。
  • 可以避開高快速道路、收費道路、渡輪、特定大眾運輸工具等等。
  • 支援車牌限行、排氣量限制、低污染區域、特定道路稅等特定國家的特殊限制。
  • 支援詳細的卡車限制定義,如長/寬/高/重量/軸數/載運物等等。

而 Matrix Routing 所輸出的結果並不是一條規劃好的路徑,而是一個矩陣或清單,依序列出點到點之間的結果。例如,以下就是一個 Matrix Routing 所算出的「二起點對二終點」的結果,您可以看到在「matrixEntry」這個屬性包含一個矩陣,其中分別是:

  1. 從「startIndex=0」到「destinationIndex=0」,成本係數為 875。
  2. 從「startIndex=0」到「destinationIndex=1」,成本係數為 1653。
  3. 從「startIndex=1」到「destinationIndex=0」,成本係數為 2686。
  4. 從「startIndex=1」到「destinationIndex=1」,成本係數為 2428。

因此我們可以知道,從「startIndex=0」到「destinationIndex=0」的成本最低,而從「startIndex=1」到「destinationIndex=0」的成本最高。

{
    "response": {
        "metaInfo": {
            "timestamp": "2020-09-16T08:02:33Z",
            "mapVersion": "8.30.112.153",
            "moduleVersion": "7.2.202037-7814",
            "interfaceVersion": "2.6.76",
            "availableMapVersion": [
                "8.30.112.153"
            ]
        },
        "matrixEntry": [
            {
                "startIndex": 0,
                "destinationIndex": 0,
                "summary": {
                    "costFactor": 875
                }
            },
            {
                "startIndex": 0,
                "destinationIndex": 1,
                "summary": {
                    "costFactor": 1653
                }
            },
            {
                "startIndex": 1,
                "destinationIndex": 0,
                "summary": {
                    "costFactor": 2686
                }
            },
            {
                "startIndex": 1,
                "destinationIndex": 1,
                "summary": {
                    "costFactor": 2428
                }
            }
        ]
    }
}

使用 HERE Routing API Reference Client 玩轉 Matrix Routing

快速建構地圖服務(七)- 認識 HERE Routing API - 路徑規劃 一文中我們已經介紹過 HERE Routing API Reference Client 這個有用的工具,我們也可運用這個工具來體驗 Matrix Routing,會更有效率。

打開 HERE Routing API Reference Client,接著請先按下左上角的「New Tab +」,選擇「Caculate Matrix」,您會看到畫面上面多了一個「Matrix 1」的標籤頁,這個標籤頁就是 Matrix Routing;而旁邊的「 OLS 1」則是 Routing API V8。

接著我們把地圖移動到台灣,您可以直接在地圖畫面上拖動,也可以使用畫面上方的搜尋功能,輸入字串後按下「Enter」就會移動到搜尋結果。

可以看到畫面已經在台北市了,接著我們可以在地圖上面隨意的按下滑鼠右鍵試試看,會出現一個功能表,可以進行相關的一些操作。

接著我們就來先試試看「一對多」的路徑規劃,請在地圖上任意位置按下右鍵選擇「Add Start」來新增一個起點,並且在其他任意位置上按下右鍵選擇「Add Destination」來新增多個終點。

地圖上的「S0」代表的就是起點,因為我們目前只建立了一個起點,因此序號就是 0;至於終點有五個,分別是「D0」、「D1」、「D2」、「D3」、「D4」。您也可以在畫面的左方手動輸入起始點與終點的經緯度座標,您在地圖上面新增的起點與終點也會同步在左方顯示出來。

右方的功能表,在「SEARCH RANGE」可以輸入希望查詢的最大距離,如果目的地超過這個距離,則不會列入計算中。下方的「Mode」可以選擇車種,「ROUTE TYPE」則是選擇「fastest / 最快路徑」或「shortest / 最短路徑」,「TRAFFIC ROUTING」可以選擇是否要使用即時路況來進行計算。而下方的「Features」可以選擇避開特定種類道路。

往下還可以選擇出發時間以及迴避特定道路或區域等等。這些選項跟我們之前談過的計算路徑都是一樣的。

當我們按下右下角的「Send」之後,就會進行計算,並在畫面中顯示出來。

您也可以在畫面上點到點之間的虛線按下右鍵選擇「Calc Route in New Tab」,這樣就會算出實際移動的路線。

我們可以在畫面的右側「MATRIX ENTRY」中查詢每一個起點到終點的計算結果,例如這個案例中,從「S0」到「D0」的移動時間是 5 分 43 秒,移動距離為 2.411 公里,成本係數為 355。以此類推。

而最後的結果,成本最低的是從「S0」移動到「D4」,因此您可以想像「S0」可能是您現在的位置,而「D4」可能這幾個加油站之中是離您最近的一個。

Matrix Entry S0-D0
TRAVEL TIME: 05 min 43 sec
DISTANCE: 2.144 km (1.332 mi)
COST FACTOR: 355

Matrix Entry S0-D1
TRAVEL TIME: 05 min 51 sec
DISTANCE: 1.831 km (1.138 mi)
COST FACTOR: 380

Matrix Entry S0-D2
TRAVEL TIME: 06 min 04 sec
DISTANCE: 2.166 km (1.346 mi)
COST FACTOR: 369

Matrix Entry S0-D3
TRAVEL TIME: 07 min 12 sec
DISTANCE: 2.459 km (1.528 mi)
COST FACTOR: 448

Matrix Entry S0-D4
TRAVEL TIME: 04 min 46 sec
DISTANCE: 1.833 km (1.139 mi)
COST FACTOR: 291

除了「一對多」的計算,您也可以使用 HERE Routing API Reference Client 來測試「多對一」或「多對多」的計算,藉由 Matrix Routing 的協助,您可以快速的了解到點對點之間的空間關係,並協助您在關於地理位置或地圖的應用中做出決策。

當然您也可以說,我用兩點的座標算出直線就可以了,為什麼還要用 Matrix Routing?事實上,在實務上確實很多時候是用直線距離來作為計算的依據,但這樣會遇到某些問題:

  1. 直線距離短,但實際移動需要的道路可能處於壅塞狀態。
  2. 直線距離短,但中間可能沒有道路連接。
  3. 直線距離短,但道路限制導致無法通行而必須繞路。

例如我們剛剛計算的這個案例,雖然乍看之下從「S0」到「D1」的直線距離是最短的,但是因為中間經過數次的轉彎,雖然駕駛距離只有 1.831 公里,但轉彎與等待紅綠燈的時間也會被考慮進去,因此預計到達時間為 5 分 51 秒。

反觀「S0」到「D4」,雖然直線距離比「S0」到「D1」長了不少,但是因為中間經過的是速度比較快的主要道路,因此預計到達時間反而只有 4 分 46 秒,足足快了一分鐘,因此所耗費的成本是比較低的。

上面的結果是沒有考慮即時路況的結果,我們如果把「TRAFFIC ROUTING」設定成「Enabled」再跑一次,來試試看結果是否會有所不同。以下是結果:

Matrix Entry S0-D0
TRAVEL TIME: 07 min 27 sec
DISTANCE: 2.144 km (1.332 mi)
COST FACTOR: 459

Matrix Entry S0-D1
TRAVEL TIME: 08 min 30 sec
DISTANCE: 2.017 km (1.253 mi)
COST FACTOR: 544

Matrix Entry S0-D2
TRAVEL TIME: 11 min 02 sec
DISTANCE: 2.184 km (1.357 mi)
COST FACTOR: 703

Matrix Entry S0-D3
TRAVEL TIME: 10 min 03 sec
DISTANCE: 2.640 km (1.640 mi)
COST FACTOR: 636

Matrix Entry S0-D4
TRAVEL TIME: 06 min 03 sec
DISTANCE: 1.833 km (1.139 mi)
COST FACTOR: 368

從上面的例子可以看出,即使加入即時路況計算,結果雖然沒有改變,但移動的時間都比沒有即時路況的時候增加了。例如「S0」到「D4」的組合,雖然還是最快的,但是移動時間從 4 分 46 秒拉長到 6 分 03 秒,比起「S0」到「D1」的 8 分 30 秒,快了將近一分半。

因此在這邊我要表達的是,用直線距離確實簡單又方便,但是可能的風險還是需要考慮進去的;然而 HERE Routing API 所提供的 Matrix Routing 功能,除了把道路的狀況、車種都納入計算之中,更能夠結合即時路況來算出更準確的結果。

另一種會遇到的狀況如下,這是一個「多對一」的場景,「D0」為家樂福內湖店,而「S0」、「S1」、「S2」分別代表三台計程車,這是模擬一個乘客在家樂福內湖店叫車,而派車系統中附近有三台計程車可以載客,必須選擇其中一台最快抵達乘客位置的車輛。

以直線距離來看,「S0」離「D0」是最近的,而「S1」是最遠的,但實際計算的結果反而從「S1」到「D0」是最快的(僅 3 分 48 秒),移動距離也是最短的(1.027 公里)。

Matrix Entry S0-D0
TRAVEL TIME: 09 min 20 sec
DISTANCE: 3.088 km (1.919 mi)
COST FACTOR: 621

Matrix Entry S1-D0
TRAVEL TIME: 03 min 48 sec
DISTANCE: 1.027 km (0.638 mi)
COST FACTOR: 277

Matrix Entry S2-D0
TRAVEL TIME: 06 min 12 sec
DISTANCE: 2.321 km (1.442 mi)
COST FACTOR: 395

關鍵在於「S0」到「D0」之間隔了一條河流,而必須先繞路到民權大橋過河之後才能抵達「D0」:

而比較「S1」與「S2」的實際移動路線,會發現因為「S2」的初始位置位在巷弄中,與「D0」之間又沒有主要道路連接,因此需要繞一段路,花了 6 分 12 秒才能到達「D0」,反而不如「S1」只需要 3 分 48 秒。

同樣的,我們也可以把下方的「API CALL」文字框中的 URL 複製出來:

https://matrix.route.api.here.com/routing/7.2/calculatematrix.json
?mode=fastest;car;traffic:enabled
&matrixattributes=ix,su
&summaryattributes=cf,tt,di
&start0=25.058879,121.568246
&start1=25.065293,121.580477
&start2=25.054913,121.580735
&destination0=25.060074,121.574855
&app_code=pxIXqdtgOSwQDXSDfjLQpw
&app_id=cgZPrYfgRePXzXC3PbBp

跟 Routing API 的路徑規劃功能一樣,我們要稍微修改一下 URL 才可以在我們的應用程式或網頁中使用,修改後如下:

https://route.ls.hereapi.com/routing/7.2/calculatematrix.json
?mode=fastest;car;traffic:enabled // 計算最快的汽車路線並考慮即時路況
&matrixattributes=ix,su // 在結果中回傳索引編號(ix)與概要(su)
&summaryattributes=cf,tt,di // 概要中列出成本係數(cf)、移動時間(tt)與移動距離(di)
&start0=25.058879,121.568246 // 起點 0
&start1=25.065293,121.580477 // 起點 1
&start2=25.054913,121.580735 // 起點 2
&destination0=25.060074,121.574855 // 終點 0
&apikey={APIKEY} // 您的 APIKEY

這樣您應該更有概念了:看起來近的不一定近,看起來遠的也不一定遠;等待的成本高,但非預期的等待成本更高! HERE 的 Matrix Routing 可以協助您獲得正確的空間關係,進而做出正確的決策。

「快速建構地圖服務」系列文章

快速建構地圖服務(一) - 認識 HERE Studio / Data Hub
快速建構地圖服務(二) - 認識 HERE Data Hub CLI / API
快速建構地圖服務(三) - 使用 QGIS 玩轉 HERE Data Hub
快速建構地圖服務(四) - 當 Leaflet JS 遇見 Data Hub
快速建構地圖服務(五) - 整合 HERE 地點搜尋 API
快速建構地圖服務(六)- HERE Waypoints Sequence 路徑最佳排序
快速建構地圖服務(七)- 認識 HERE Routing API - 路徑規劃
快速建構地圖服務(八)- 認識 Matrix Routing
快速建構地圖服務(九)- Isoline Routing
快速建構地圖服務(十)- HERE Tour Planning 物流路徑預排與成本精算
快速建構地圖服務(十一)- HERE Route Matching GPS 軌跡分析
快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢
快速建構地圖服務(十三)- HERE Geofencing 地理圍籬
快速建構地圖服務(十四)- HERE Custom Routes 自建路網 + Vector Tile 向量圖磚 + Map Image API 靜態地圖
快速建構地圖服務(十五)- HERE Positioning 網路定位服務


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言